package multithreading;

/**
 * @Author: 海琳琦
 * @Date: 2022/4/3 11:24
 */
class Ticket1 extends Thread {

    /**
     * 继承的方式要对变量添加static修饰符才能共享数据
     */
    private static int ticket = 10011;

    /**
     * 可以使用synchronized(类.class)代替，不能使用synchronized(this)   类.class只会加载一次（重点为同步监视器作为对象要唯一）
     */
    private static final Object OBJ = new Object();

    @Override
    public void run() {
        while (true) {
            //不能使用synchronized(this)   可以使用synchronized(类.class)  类.class只会加载一次
//            synchronized(OBJ){
//              synchronized(Ticket1.class){
//                if (ticket > 0) {
////                    try {
////                        Thread.sleep(100);
////                    } catch (InterruptedException e) {
////                        e.printStackTrace();
////                    }
//                    System.out.println(this.getName() + "售出车票，车票号为：" + ticket--);
//                }else{
//                    break;
//                }
//            }
            show();
        }
    }

    /**
     * 必须改成静态方法这时候  同步方法synchronized的内置同步监视器才能使用同一对象
     */
    private static synchronized void show() {
        if (ticket > 0) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "售出车票，车票号为：" + ticket--);
        }
    }
}

public class TicketDemo1 {
    public static void main(String[] args) {
        Ticket1 ticket1 = new Ticket1();
        Ticket1 ticket2 = new Ticket1();
        Ticket1 ticket3 = new Ticket1();
        ticket1.setName("窗口1");
        ticket2.setName("窗口2");
        ticket3.setName("窗口3");
        ticket1.start();
        ticket2.start();
        ticket3.start();
    }

}
